﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ComunesMGI.Constantes;
using ClienteWinMGI.Logica;
using ComunesMGI.Mensajes;

namespace ClienteWinMGI.Presentacion
{
    public partial class ModificarWorkPackage : Form
    {
        DataWP _datosWP;
        List<DataEstadoWP> _estados;
        public ModificarWorkPackage(DataWP datosWP )
        {
            this._datosWP = datosWP;
            InitializeComponent();
            ClearValidator();
            CargarDatos();
        }

        private void CargarDatos()
        { 
            //cargo el nombre del work package
            txtNombre.Text = _datosWP.Nombre;

            //cargo la fecha de inicio
            dFI.NullValue = "Seleccione si desea una fecha";
            if (_datosWP.FechaInicio.Equals(ConstantesMGI.FechaVacia))
            {
                dFI.Value = null;
            }
            else
            {
                dFI.Value = _datosWP.FechaInicio;
            }

            //cargo la fecha estimada de entrega
            dFEE.NullValue = "Seleccione si desea una fecha";
            if (_datosWP.FechaEstimadaEntrega.Equals(ConstantesMGI.FechaVacia))
            {
                dFEE.Value = null;
            }
            else
            {
                dFEE.Value = _datosWP.FechaEstimadaEntrega;
            }

            //cargo la fecha de entrega
            dFE.NullValue = "Seleccione si desea una fecha";
            if (_datosWP.FechaEntrega.Equals(ConstantesMGI.FechaVacia))
            {
                dFE.Value = null;
            }
            else
            {
                dFE.Value = _datosWP.FechaEntrega;
            }

            //cargo el esfuerzo total
            if(_datosWP.EsfuerzoTotal!= ConstantesMGI.EnteroVacio)
                txtET.Text = _datosWP.EsfuerzoTotal.ToString();
            if(_datosWP.EsfuerzoRestante!= ConstantesMGI.EnteroVacio)
                txtER.Text = _datosWP.EsfuerzoRestante.ToString();

            //cargo el combo con los estados posibles
            try
            {
                IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();
                _estados = ii.GetEstadosWP();

                foreach (DataEstadoWP es in _estados)
                {
                    cboEstado.Items.Add(es.Estado);
                    if (es.Estado.Equals(_datosWP.Estado.Estado))
                        cboEstado.SelectedItem = es.Estado;
                }

            }
            catch (Exception ex)
            {
                MsgError err = new MsgError("Error", "", ex.Message);
                err.ShowDialog();
            }



        
        }

        private void ClearValidator()
        {
            imgValidator.Visible = false;
            lblValidator.Visible = false;
        }

        private void ShowValidator(string textoValidator)
        {
            imgValidator.Visible = true;
            lblValidator.Visible = true;
            lblValidator.Text = textoValidator;
        }
        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private DataWP obtenerWPModificado()
        {
            DataEstadoWP eWP = _estados.First(de => de.Estado == cboEstado.SelectedItem.ToString());
            string nombre = txtNombre.Text;
            
            //obtengo la fecha de inicio
            DateTime fInicio= ConstantesMGI.FechaVacia;
            if (dFI.Value != null)
            {
                fInicio = (DateTime)dFI.Value;
            }

            //obtengo la fecha estimada de entrega
            DateTime fEstimadaEntrega = ConstantesMGI.FechaVacia;
            if (dFEE.Value != null)
            {
                fEstimadaEntrega = (DateTime)dFEE.Value;
            }

            //obtengo la fecha de entrega
            DateTime fEntrega = ConstantesMGI.FechaVacia;
            if (dFE.Value != null)
            {
                fEntrega = (DateTime)dFE.Value;
            }

            DateTime fFin= ConstantesMGI.FechaVacia;
            if (eWP.Final)
            {
                fFin= DateTime.Today;
            }
            DataWP dataWP = new DataWP(_datosWP.Id, nombre, fInicio, fEstimadaEntrega, fEntrega, fFin, _datosWP.EsfuerzoTotal, _datosWP.EsfuerzoRestante, eWP,_datosWP.IdSistema);
            return dataWP;
        }

        private bool verificarDatos()
        {
            if (txtNombre.Text == "")
            {
                ShowValidator("Debe ingresar el nombre del Work Package");
                return false;
            }
            else
            { 
                if (dFEE.Value!= null && dFI.Value!=null && (((DateTime)dFEE.Value).CompareTo((DateTime)dFI.Value) <0))
                {
                    ShowValidator("Fecha estimada de entrega debe ser posterior que la fecha de inicio");
                    return false;
                }
                else
                {
                    if(dFE.Value!=null && dFI.Value!=null && (((DateTime)dFE.Value).CompareTo((DateTime)dFI.Value)<0))
                    {
                        ShowValidator("Fecha de entrega debe ser posterior que la fecha de inicio");
                        return false;
                    
                    }
                    else
                    {
                        return true;
                    }
                }
            }
        }

        

        private void btnModificar_Click(object sender, EventArgs e)
        {
           
            try
            {
                ClearValidator();
                bool datosOk = verificarDatos();
                if(datosOk)
                {
                    DataWP wpModif= obtenerWPModificado();
                    IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();
                    if (wpModif.Estado.Final)
                    {

                        //si el estado q pusieron en el combo es el estado final
                        if ((!wpModif.FechaInicio.Equals(ConstantesMGI.FechaVacia)) && wpModif.FechaInicio.CompareTo(wpModif.FechaFin) > 0)
                        {
                            ShowValidator("Fecha de inicio es mayor que el dia de hoy");
                        }
                        else
                        {

                            bool sinCerrar = ii.ChkWPIncidentesOTareasSinCerrar(_datosWP.Id);
                            if (sinCerrar)
                            {
                                ConfirmacionCerrarIncidentes conf = new ConfirmacionCerrarIncidentes(wpModif, _datosWP);
                                conf.ShowDialog();
                                this.Close();


                            }
                            else
                            {
                                //llamar a la operacion modficar wp con el booleano el false
                                ii.ModificarWP(wpModif, false);
                                MsgNotificacion notif = new MsgNotificacion("Modificación exitosa", "Modificación exitosa", "Se ha modificado con éxito los datos del Work Package");
                                notif.ShowDialog();
                                this.Close();
                            }
                        }
                    }
                    else
                    {
                        //tengo q llamar a la opercion modificar con el booleano en false
                        ii.ModificarWP(wpModif, false);
                        MsgNotificacion notif = new MsgNotificacion("Modificación exitosa", "Modificación exitosa", "Se ha modificado con éxito los datos del Work Package");
                        notif.ShowDialog();
                        this.Close();
                    }
                }
                

            }
            catch (Exception ex)
            {
                MsgError err = new MsgError("Error", "", ex.Message);
                err.ShowDialog();
            }
                      
        }

        private void cboEstado_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void txtNombre_TextChanged(object sender, EventArgs e)
        {
            ClearValidator();
        }

        private void dFI_ValueChanged(object sender, EventArgs e)
        {
            ClearValidator();
        }

        private void dFEE_ValueChanged(object sender, EventArgs e)
        {
            ClearValidator();
        }

        private void dFE_ValueChanged(object sender, EventArgs e)
        {
            ClearValidator();
        }
    }
}
